sources <- c("ESPN", "FantasyData", "FantasyPros", "FFToday",
             "NumberFire", "Yahoo", "FantasyFootballNerd", 
             "RTSports", "Walterfootball")

scrape <- scrape_data(src = sources,
                      pos = c('QB', 'RB', 'WR', 'TE', 'DST'),
                      season = 2020, 
                      week = week)

Simulation Time!

n_sims <- 10000

tic()
sim_lu <- map_df(1:n_sims, generate_lineup) %>%
  rename(pts_base = points) %>%  
  mutate(position = factor(position, 
                           levels = c("QB", "RB", "WR", "TE", "DST"))) %>% 
  select(lineup, Name, team, position, pts_base, pts_pred, sd_pts, Salary)
toc()
## 290.548 sec elapsed

Results

sim_lu %>%
  filter(lineup<=3) %>%
  arrange(lineup, position, desc(pts_pred)) %>%
  knitr::kable() %>%
  kable_styling() %>%
  column_spec(1, bold=TRUE) %>%
  collapse_rows(columns = 1, valign = 'top')
lineup Name team position pts_base pts_pred sd_pts Salary
1 Kyler Murray ARI QB 23.09795 23.967892 0.9979381 8400
Alvin Kamara NOS RB 21.89100 22.299704 0.5144622 8800
Kenyan Drake ARI RB 15.36096 15.595509 0.3928890 7000
Robert Woods LAR WR 14.38175 16.442850 1.1430846 6700
Amari Cooper DAL WR 14.57384 16.279801 0.9488640 7100
Terry McLaurin WAS WR 13.52750 15.413864 1.3788180 6600
Keelan Cole JAC WR 9.77775 13.865819 2.6998146 5600
Hunter Henry LAC TE 9.95846 10.701827 1.0400439 6100
Jacksonville Jaguars JAC DST 6.53500 7.643367 0.6449310 3700
2 Dak Prescott DAL QB 23.44590 24.246295 1.2618409 8200
Alvin Kamara NOS RB 21.89100 22.211048 0.5144622 8800
Ezekiel Elliott DAL RB 18.92175 18.988440 0.2594550 9000
Austin Ekeler LAC RB 16.17625 17.116379 1.0155810 6900
Brandin Cooks HOU WR 11.05725 16.085749 3.1861074 5300
Tyler Boyd CIN WR 13.56550 14.349883 0.4358844 6000
Michael Gallup DAL WR 11.90925 14.247401 0.9755508 5900
Darren Waller LVR TE 12.70448 13.058139 1.3677714 6700
New York Giants NYG DST 5.13000 5.154311 0.0444780 3000
3 Dak Prescott DAL QB 23.44590 25.508314 1.2618409 8200
Alvin Kamara NOS RB 21.89100 21.758035 0.5144622 8800
Dalvin Cook MIN RB 18.59245 19.207934 0.8871970 8700
Devin Singletary BUF RB 12.78175 14.550369 2.1942480 6000
Robert Woods LAR WR 14.38175 16.413120 1.1430846 6700
Emmanuel Sanders NOS WR 11.90600 14.308853 1.3743702 5800
Tre’Quan Smith NOS WR 9.03525 13.792842 2.0904660 5300
Darren Waller LVR TE 12.70448 15.122739 1.3677714 6700
Jacksonville Jaguars JAC DST 6.53500 7.096636 0.6449310 3700
ggplotly(sim_lu %>% 
           group_by(Name, position, Salary) %>% 
           dplyr::summarize(lu = n_distinct(lineup)) %>% 
           ungroup() %>% 
           group_by(position) %>% 
           top_n(10, lu) %>% 
           ungroup() %>% 
           arrange(position, desc(lu)) %>% 
           mutate(Name = factor(Name),
                  Name = fct_reorder(Name, lu),
                  pct = round(lu / n_sims, 3) * 100) %>% 
           ggplot(aes(x = Name, y = pct, fill = Salary,
                      text = paste(Name, "in", lu, "lineups with", Salary, "salary"))) +
           geom_bar(stat = "identity") +
           facet_wrap(~position, ncol = 2, scales = "free_y") +
           coord_flip() +
           scale_fill_viridis_c() +
           xlab("") +
           ylab("Lineups (thousands)") +
           ggtitle("Top 10 Players By Position")) %>% 
  ggplotly(tooltip = "text")
plyr_lu <- sim_lu %>%
  group_by(Name, position) %>%
  dplyr::summarize(lu=n_distinct(lineup)) %>%
  ungroup() 

ggplotly(projections %>% 
  filter(avg_type=='weighted') %>%
  mutate(Name = ifelse(pos=="DST", last_name, paste(first_name, last_name))) %>%
  inner_join(fan_duel, by = c("Name", "position")) %>%
  select(Name, team, position, points, Salary, sd_pts) %>%
  left_join(plyr_lu, by='Name') %>%
  replace_na(list(lu=0)) %>%
  mutate(lu_bin=ifelse(lu==0, '0 Lineups', '>=1 Lineups'),
         lu_5=cut(lu,5, labels = FALSE)) %>%
  ggplot(aes(x=Salary, y=points, color=lu_bin, size=sd_pts, text=Name)) +
  geom_point() +
  theme_minimal() +
  scale_color_manual(values = c('red', 'blue'), name="") +
  geom_smooth(inherit.aes = FALSE, aes(x=Salary, y=points), method = 'lm') +
  ylab('Projected Points') +
  xlab('Salary') +
  ggtitle('Who makes it into Optimized Lineups?') +
  scale_x_continuous(labels=scales::dollar))
sim_lu %>%
  group_by(lineup) %>%
  mutate(lineup_pts=sum(pts_pred)) %>%
  group_by(lineup, position) %>%
  mutate(n = n()) %>%
  select(lineup, position, n, lineup_pts) %>%
  distinct() %>%
  spread(key=position, value=n) %>%
  filter(RB >= 2, TE >= 1, WR >= 3) %>%
  mutate(flex = case_when(RB==3 ~ 'RB',
                          TE==2 ~ 'TE',
                          WR==4 ~ 'WR')) %>%
  group_by(flex) %>%
  dplyr::summarize(median_pts = round(median(lineup_pts), 3),
                   cases = n()) %>%
  knitr::kable() %>%
  kable_styling(full_width = FALSE)
flex median_pts cases
RB 144.903 8311
WR 145.309 1689
lu_df <- sim_lu %>%
  group_by(lineup) %>%
  dplyr::summarize(lineup_pts=sum(pts_pred),
                   lineup_sd=sum(sd_pts)) %>%
  ungroup()

pto <- psel(lu_df, low(lineup_sd) * high(lineup_pts))


ggplot(lu_df, aes(y=lineup_pts, x=lineup_sd)) +
  geom_point() +
  geom_point(data=pto, size=5) +
  ylab('Lineup Points') +
  xlab('Lineup Points St Dev') +
  ggtitle('Lineup Points vs Uncertainty',
          subtitle = 'Pareto Lineups Bolded')

psel(lu_df, low(lineup_sd) * high(lineup_pts)) %>%
  left_join(sim_lu, by='lineup') %>%
  group_by(lineup) %>%
  arrange(lineup_pts, position, desc(Salary)) %>%
  select(lineup, lineup_pts, lineup_sd, Name, team, position, pts_pred, sd_pts, Salary) %>%
  mutate_at(vars(lineup_pts, lineup_sd, pts_pred, sd_pts), function(x) round(x, 2)) %>%
  knitr::kable() %>%
  kable_styling(fixed_thead = T) %>%
  column_spec(1:3, bold=TRUE) %>%
  collapse_rows(columns = 1:3, valign = 'top') %>%
  scroll_box(height = '700px', width = '100%')
lineup lineup_pts lineup_sd Name team position pts_pred sd_pts Salary
871 138.91 4.96 Russell Wilson SEA QB 25.95 1.09 9000
Alvin Kamara NOS RB 21.74 0.51 8800
Austin Ekeler LAC RB 17.33 1.02 6900
James Robinson JAC RB 14.65 0.00 6600
DK Metcalf SEA WR 14.99 0.04 6900
Tyler Boyd CIN WR 13.45 0.44 6000
Jarvis Landry CLE WR 11.97 0.11 5700
Darren Waller LVR TE 12.62 1.37 6700
Cincinnati Bengals CIN DST 6.22 0.39 3400
8298 139.53 5.43 Russell Wilson SEA QB 26.44 1.09 9000
Alvin Kamara NOS RB 21.57 0.51 8800
Josh Jacobs LVR RB 19.11 1.54 8000
Austin Ekeler LAC RB 15.76 1.02 6900
DK Metcalf SEA WR 14.98 0.04 6900
Tyler Boyd CIN WR 14.11 0.44 6000
Jarvis Landry CLE WR 12.03 0.11 5700
Mike Gesicki MIA TE 10.47 0.64 5700
New York Giants NYG DST 5.05 0.04 3000
1211 139.56 5.87 Dak Prescott DAL QB 23.99 1.26 8200
Alvin Kamara NOS RB 21.25 0.51 8800
Dalvin Cook MIN RB 19.93 0.89 8700
James Robinson JAC RB 14.65 0.00 6600
Terry McLaurin WAS WR 15.39 1.38 6600
Tyler Boyd CIN WR 13.65 0.44 6000
Jarvis Landry CLE WR 12.03 0.11 5700
Mike Gesicki MIA TE 11.78 0.64 5700
Jacksonville Jaguars JAC DST 6.88 0.64 3700
7187 143.16 5.95 Dak Prescott DAL QB 25.16 1.26 8200
Alvin Kamara NOS RB 23.49 0.51 8800
Dalvin Cook MIN RB 20.68 0.89 8700
Austin Ekeler LAC RB 17.16 1.02 6900
Stefon Diggs BUF WR 15.71 1.04 7000
Tyler Boyd CIN WR 14.01 0.44 6000
Jarvis Landry CLE WR 12.03 0.11 5700
Mike Gesicki MIA TE 9.88 0.64 5700
New York Giants NYG DST 5.04 0.04 3000
8651 143.44 6.09 Josh Allen BUF QB 25.19 0.71 8600
Alvin Kamara NOS RB 22.35 0.51 8800
Kenyan Drake ARI RB 15.68 0.39 7000
Austin Ekeler LAC RB 17.06 1.02 6900
Amari Cooper DAL WR 16.89 0.95 7100
Tyler Boyd CIN WR 14.75 0.44 6000
T.Y. Hilton IND WR 13.88 0.66 5900
Darren Waller LVR TE 12.49 1.37 6700
New York Giants NYG DST 5.14 0.04 3000
5023 143.53 6.34 Kyler Murray ARI QB 24.58 1.00 8400
Alvin Kamara NOS RB 21.76 0.51 8800
James Robinson JAC RB 14.65 0.00 6600
Tyler Lockett SEA WR 17.25 1.10 7500
Robert Woods LAR WR 16.24 1.14 6700
Tyler Boyd CIN WR 14.31 0.44 6000
T.Y. Hilton IND WR 13.20 0.66 5900
Darren Waller LVR TE 15.19 1.37 6700
Dallas Cowboys DAL DST 6.34 0.12 3400
438 149.04 6.35 Russell Wilson SEA QB 25.18 1.09 9000
Ezekiel Elliott DAL RB 19.20 0.26 9000
Alvin Kamara NOS RB 22.59 0.51 8800
David Montgomery CHI RB 17.20 1.51 5800
DK Metcalf SEA WR 15.09 0.04 6900
Tyler Boyd CIN WR 15.05 0.44 6000
Justin Jefferson MIN WR 18.21 1.74 5400
Mike Gesicki MIA TE 10.24 0.64 5700
Dallas Cowboys DAL DST 6.26 0.12 3400
6378 149.28 7.86 Kyler Murray ARI QB 26.60 1.00 8400
Alvin Kamara NOS RB 22.30 0.51 8800
Josh Jacobs LVR RB 21.54 1.54 8000
David Montgomery CHI RB 18.08 1.51 5800
Amari Cooper DAL WR 15.21 0.95 7100
Tyler Boyd CIN WR 13.74 0.44 6000
T.Y. Hilton IND WR 13.89 0.66 5900
Hunter Henry LAC TE 10.94 1.04 6100
Arizona Cardinals ARI DST 6.99 0.21 3800
1176 150.76 8.45 Russell Wilson SEA QB 26.85 1.09 9000
Alvin Kamara NOS RB 22.60 0.51 8800
David Montgomery CHI RB 16.80 1.51 5800
Tyler Lockett SEA WR 17.36 1.10 7500
Cooper Kupp LAR WR 18.79 1.72 7200
Tyler Boyd CIN WR 14.09 0.44 6000
T.Y. Hilton IND WR 14.11 0.66 5900
Darren Waller LVR TE 15.07 1.37 6700
New York Giants NYG DST 5.09 0.04 3000
1938 151.65 8.78 Russell Wilson SEA QB 26.99 1.09 9000
Alvin Kamara NOS RB 22.49 0.51 8800
Dalvin Cook MIN RB 18.78 0.89 8700
Austin Ekeler LAC RB 18.38 1.02 6900
Tyler Boyd CIN WR 14.17 0.44 6000
Emmanuel Sanders NOS WR 15.29 1.37 5800
Keelan Cole JAC WR 18.82 2.70 5600
Mike Gesicki MIA TE 10.79 0.64 5700
Dallas Cowboys DAL DST 5.94 0.12 3400
5015 151.99 9.42 Dak Prescott DAL QB 24.97 1.26 8200
Alvin Kamara NOS RB 22.04 0.51 8800
Dalvin Cook MIN RB 19.72 0.89 8700
David Montgomery CHI RB 14.43 1.51 5800
Tyler Lockett SEA WR 17.77 1.10 7500
Tyler Boyd CIN WR 14.15 0.44 6000
Darius Slayton NYG WR 21.74 2.87 5500
Mike Gesicki MIA TE 10.34 0.64 5700
Arizona Cardinals ARI DST 6.82 0.21 3800
7994 153.26 9.69 Josh Allen BUF QB 24.99 0.71 8600
Alvin Kamara NOS RB 22.35 0.51 8800
Austin Ekeler LAC RB 16.96 1.02 6900
David Montgomery CHI RB 18.45 1.51 5800
Robert Woods LAR WR 15.42 1.14 6700
Tyler Boyd CIN WR 14.46 0.44 6000
Darius Slayton NYG WR 18.89 2.87 5500
Darren Waller LVR TE 13.44 1.37 6700
Los Angeles Rams LAR DST 8.29 0.13 4800
2985 154.31 9.71 Russell Wilson SEA QB 25.61 1.09 9000
Ezekiel Elliott DAL RB 19.04 0.26 9000
Alvin Kamara NOS RB 21.51 0.51 8800
Austin Ekeler LAC RB 17.03 1.02 6900
Emmanuel Sanders NOS WR 15.64 1.37 5800
Darius Slayton NYG WR 22.91 2.87 5500
Justin Jefferson MIN WR 14.53 1.74 5400
Mike Gesicki MIA TE 10.99 0.64 5700
Arizona Cardinals ARI DST 7.05 0.21 3800
3165 155.63 10.41 Russell Wilson SEA QB 27.53 1.09 9000
Alvin Kamara NOS RB 22.63 0.51 8800
Austin Ekeler LAC RB 19.26 1.02 6900
David Montgomery CHI RB 15.41 1.51 5800
Adam Thielen MIN WR 17.23 1.08 7100
Tyler Boyd CIN WR 14.10 0.44 6000
Brandin Cooks HOU WR 17.62 3.19 5300
Darren Waller LVR TE 14.88 1.37 6700
Arizona Cardinals ARI DST 6.96 0.21 3800
8537 156.23 11.31 Dak Prescott DAL QB 25.75 1.26 8200
Alvin Kamara NOS RB 22.80 0.51 8800
Nick Chubb CLE RB 18.40 1.35 8300
Austin Ekeler LAC RB 19.15 1.02 6900
DeVante Parker MIA WR 20.59 2.57 6500
Emmanuel Sanders NOS WR 13.99 1.37 5800
Justin Jefferson MIN WR 16.02 1.74 5400
Darren Waller LVR TE 13.12 1.37 6700
Dallas Cowboys DAL DST 6.42 0.12 3400
9050 158.63 11.46 Dak Prescott DAL QB 25.70 1.26 8200
Ezekiel Elliott DAL RB 18.85 0.26 9000
Alvin Kamara NOS RB 21.41 0.51 8800
Austin Ekeler LAC RB 16.70 1.02 6900
A.J. Green CIN WR 13.90 1.79 5700
Darius Slayton NYG WR 22.98 2.87 5500
Justin Jefferson MIN WR 15.23 1.74 5400
Darren Waller LVR TE 15.89 1.37 6700
Jacksonville Jaguars JAC DST 7.97 0.64 3700
1035 159.88 13.42 Russell Wilson SEA QB 25.53 1.09 9000
Alvin Kamara NOS RB 21.82 0.51 8800
Austin Ekeler LAC RB 16.91 1.02 6900
Devin Singletary BUF RB 16.56 2.19 6000
Stefon Diggs BUF WR 15.35 1.04 7000
Darius Slayton NYG WR 23.15 2.87 5500
Brandin Cooks HOU WR 17.37 3.19 5300
Darren Waller LVR TE 14.83 1.37 6700
Los Angeles Rams LAR DST 8.36 0.13 4800
7633 160.34 14.15 Josh Allen BUF QB 23.74 0.71 8600
Alvin Kamara NOS RB 22.17 0.51 8800
Josh Jacobs LVR RB 20.14 1.54 8000
Austin Ekeler LAC RB 16.08 1.02 6900
DeVante Parker MIA WR 18.18 2.57 6500
Darius Slayton NYG WR 18.43 2.87 5500
Brandin Cooks HOU WR 20.63 3.19 5300
Darren Waller LVR TE 14.37 1.37 6700
Cincinnati Bengals CIN DST 6.61 0.39 3400
1040 164.38 14.94 Russell Wilson SEA QB 26.81 1.09 9000
Alvin Kamara NOS RB 22.60 0.51 8800
Austin Ekeler LAC RB 17.52 1.02 6900
Devin Singletary BUF RB 16.35 2.19 6000
DeVante Parker MIA WR 19.69 2.57 6500
Darius Slayton NYG WR 21.14 2.87 5500
Brandin Cooks HOU WR 18.59 3.19 5300
Darren Waller LVR TE 13.33 1.37 6700
Los Angeles Rams LAR DST 8.35 0.13 4800